/**
 * 
 */
package ar.edu.utn.frgp.banco.service.impl;

import java.math.BigDecimal;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.CuentaDao;
import ar.edu.utn.frgp.banco.dao.ServiciosDao;
import ar.edu.utn.frgp.banco.dao.impl.CuentasDaoImpl;
import ar.edu.utn.frgp.banco.dao.impl.ServiciosDaoImpl;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.PagoServicios;
import ar.edu.utn.frgp.banco.domain.Servicios;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.service.ServiciosService;
import ar.edu.utn.frgp.banco.utils.Constantes;
import ar.edu.utn.frgp.banco.utils.Logger;

/**
 * @author PUSDERKIS
 *
 */
public class ServiciosServiceImpl implements ServiciosService {

	private ServiciosDao serviciosDao;
	private CuentaDao cuentaDao;
	
	public ServiciosServiceImpl(){
		serviciosDao = new ServiciosDaoImpl();
		cuentaDao = new CuentasDaoImpl();
	}
	
	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.service.ServiciosService#obtenerServicios()
	 */
	@Override
	public List<Servicios> obtenerServicios() throws ServiceException {
		List<Servicios> serv = null;
		try{
			serv = serviciosDao.obtenerServicios();
		} catch (DataAccessException e) {
			Logger.error("Ocurrio un error al obtener el listado de servicios disponibles:" + this.getClass());
			throw new ServiceException("Fallo en la obtencion de serivcios.", e);
		}
		
		return serv;
	}

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.service.ServiciosService#pagarServicio(ar.edu.utn.frgp.banco.domain.PagoServicios)
	 */
	@Override
	public void pagarServicio(PagoServicios pago) throws ServiceException {
		
		try{
			Cuenta c = cuentaDao.obtenerCuenta(pago.getCuenta().getNumero());
			
			Servicios serv = serviciosDao.obtenerServicio(pago.getServicio().getId());
			pago.setCuenta(c);
			pago.setServicio(serv);
			
			if((c.getSaldo().doubleValue()+c.getDescubierto().doubleValue() - serv.getMontoFijo().doubleValue()) < 0){
				throw new ServiceException(Constantes.OPERACION_SALDO_INSUFICIENTE);
			}
			
			serviciosDao.pagarServicio(pago);
		} catch (DataAccessException e) {
			throw new ServiceException("Ocurrio un error al registrar el pago",e);
		}

	}

}
